//
//  CommentTextView.swift
//  WeiboDemo
//
//  Created by 姬向阳 on 2020/4/28.
//  Copyright © 2020 SUNNYJ. All rights reserved.
//

import SwiftUI

// 把UITextView封装成SwiftUI的View
struct CommentTextView: UIViewRepresentable {
    // SwiftUI的属性 text 文本框里的内容
    @Binding var text : String
    // 是否第一次出现时就进入编辑状态
    let beginEdittingOnAppear: Bool
    
    // 协议必需实现(1):创建View
    func makeUIView(context: Context) -> UITextView {
        let view = UITextView()
        view.backgroundColor = .systemGray6
        view.font = .systemFont(ofSize: 18)
        view.textContainerInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15)
        view.delegate = context.coordinator
        view.text = text
        return view
    }
    
    // 协议必需实现(2):更新View
    func updateUIView(_ uiView: UITextView, context: Context) {
        /*
         如果第一次出现时就进入编辑状态,
         且TextView还没有成为第一响应者
         且uiView.window不为空.如果window为空,表示UITextView还未显示出来,此时进入编辑状态会报错
         且TextView不是第一响应者.
        */
        if beginEdittingOnAppear,
            !context.coordinator.didBecomeFirstResponder,
            uiView.window != nil,
            !uiView.isFirstResponder{
            // 让TextView成为第一响应者,即进入编辑状态
            uiView.becomeFirstResponder()
            // 标记TextView已经成为第一响应者,保证if语句花括号内的内容只被执行一次
            context.coordinator.didBecomeFirstResponder = true
        }
    }
    
    // 容器类 实现代理UItextView的方法
    class Coordinator: NSObject, UITextViewDelegate {
        let parent: CommentTextView
        // 标记TextView是否已经成为第一响应者
        var didBecomeFirstResponder: Bool = false
        
        init(_ view: CommentTextView) {
            parent = view
        }
        // 代理方法
        func textViewDidChange(_ textView: UITextView) {
            parent.text = textView.text
        }
    }
    
    // 用到Delegate必须要Coordinator
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
}

struct CommentTextView_Previews: PreviewProvider {
    static var previews: some View {
        CommentTextView(text: .constant(""), beginEdittingOnAppear: true)
    }
}
